/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.wisnu.scs.controller;

import com.wisnu.scs.add.DateFactory;
import com.wisnu.scs.entity.DbBarang;
import com.wisnu.scs.entity.DbBarangKeluar;
import com.wisnu.scs.error.ErrorMessage;
import com.wisnu.scs.model.DbBarangKeluarModel;
import com.wisnu.scs.view.DbBarangKeluarView;
import com.wisnu.scs.view.DbBarangMasukView;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.view.JasperViewer;

/**
 *
 * @author Wisnu Wardoyo
 */
public class DbBarangKeluarController {

    private DbBarangKeluarModel model;

    public void setModel(DbBarangKeluarModel model) {
        this.model = model;
    }

    public void resetForm() {
        model.resetForm();
    }

    public void insertPengeluaran(DbBarangKeluarView view) {

        if (view.getComboNama().getSelectedIndex() == 0) {
            JOptionPane.showMessageDialog(view, "Silahkan Pilih Item Untuk dimasukan");
            return;
        }

        DbBarang barang = view.getBarang();

        Date tanggalKeluar = (Date) view.getTxtTanggalKeluar().getValue();
        String pemohon = view.getTxtPemohon().getText();
        String keperluan = view.getTxtKeperluan().getText();
        String jumlah = view.getTxtJumlah().getText();
        String keterangan = view.getTxtKeterangan().getText();

        if (pemohon.trim().equals("")) {
            JOptionPane.showMessageDialog(view, "Pemohon masih kosong");
        } else if (pemohon.length() > 255) {
            JOptionPane.showMessageDialog(view, "Pemohon tidak boleh lebih dari 255 karakter");
        } else if (keperluan.trim().equals("")) {
            JOptionPane.showMessageDialog(view, "Keperluan masih kosong");
        } else if (keperluan.length() > 255) {
            JOptionPane.showMessageDialog(view, "Keperluan tidak boleh lebih dari 255 karakter");
        } else if (jumlah.trim().equals("")) {
            JOptionPane.showMessageDialog(view, "Jumlah masih kosong");
        } else {
            int jumlahInt = 0;
            try {
                jumlahInt = Integer.parseInt(jumlah);
            } catch (NumberFormatException exception) {
                JOptionPane.showMessageDialog(view, "Jumlah harus angka");
                return;
            }
            if (barang.getStock() - jumlahInt < 0) {
                JOptionPane.showMessageDialog(view, "Jumlah stock tidak sesuai");
            } else {
                barang.setStock(barang.getStock() - jumlahInt);
                model.setBarang(barang);
                model.setPemohon(pemohon);
                model.setTanggalKeluar(tanggalKeluar);
                model.setJumlah(jumlahInt);
                model.setKeperluan(keperluan);
                model.setKeterangan(keterangan);
                try {
                    model.insertBarangKeluar();
                    JOptionPane.showMessageDialog(view, "Data berhasil dimasukan");
                } catch (ErrorMessage ex) {
                    JOptionPane.showMessageDialog(view, new Object[]{
                        "Tthrowableerjadi error pada database dengan pesan :",
                        ex.getMessage()
                    });
                } finally {
                    model.resetForm();
                }
            }
        }

    }

    public void updatePengeluaran(DbBarangKeluarView view) {

        if (view.getComboNama().getSelectedIndex() == 0) {
            JOptionPane.showMessageDialog(view, "Silahkan Pilih Item Untuk dimasukan");
            return;
        }
        if (view.getTableBarangKeluar().getSelectedRowCount() == 0) {
            JOptionPane.showMessageDialog(view, "Silahkan Pilih baris untuk diseleksi");
            return;
        }

        DbBarang barang = view.getBarang();
        DbBarangKeluar barangKeluarBegin = view.getBarangKeluar();
        Integer idPengeluaran = Integer.parseInt(view.getTxtIdPengeluaran().getText());
        Date tanggalKeluar = (Date) view.getTxtTanggalKeluar().getValue();
        String pemohon = view.getTxtPemohon().getText();
        String keperluan = view.getTxtKeperluan().getText();
        String jumlah = view.getTxtJumlah().getText();
        String keterangan = view.getTxtKeterangan().getText();

        if (pemohon.trim().equals("")) {
            JOptionPane.showMessageDialog(view, "Pemohon masih kosong");
        } else if (pemohon.length() > 255) {
            JOptionPane.showMessageDialog(view, "Pemohon tidak boleh lebih dari 255 karakter");
        } else if (keperluan.trim().equals("")) {
            JOptionPane.showMessageDialog(view, "Keperluan masih kosong");
        } else if (keperluan.length() > 255) {
            JOptionPane.showMessageDialog(view, "Keperluan tidak boleh lebih dari 255 karakter");
        } else if (jumlah.trim().equals("")) {
            JOptionPane.showMessageDialog(view, "Jumlah masih kosong");
        } else {
            int jumlahInt = 0;
            try {
                jumlahInt = Integer.parseInt(jumlah);
            } catch (NumberFormatException exception) {
                JOptionPane.showMessageDialog(view, "Jumlah harus angka");
                return;
            }
            if (barangKeluarBegin.getJumlah() < jumlahInt) {
                if (jumlahInt - barangKeluarBegin.getJumlah() > barang.getStock()) {
                    JOptionPane.showMessageDialog(view, "Jumlah Stock tidak cukup");
                    return;
                } else {
                    barang.setStock(barang.getStock() - (jumlahInt - barangKeluarBegin.getJumlah()));
                }
            } else {
                barang.setStock(barang.getStock() + (barangKeluarBegin.getJumlah() - jumlahInt));
            }
            model.setIdKeluar(idPengeluaran);
            model.setBarang(barang);
            model.setPemohon(pemohon);
            model.setJumlah(jumlahInt);
            model.setTanggalKeluar(tanggalKeluar);
            model.setKeperluan(keperluan);
            model.setKeterangan(keterangan);
            try {
                model.updateBarangKeluar();
                JOptionPane.showMessageDialog(view, "Data berhasil dirubah");
            } catch (ErrorMessage ex) {
                JOptionPane.showMessageDialog(view, new Object[]{
                    "Terjadi error pada database dengan pesan :",
                    ex.getMessage()
                });
            } finally {
                model.resetForm();
            }
        }
    }

    public void deletePengeluaran(DbBarangKeluarView view) {

        if (view.getComboNama().getSelectedIndex() == 0) {
            JOptionPane.showMessageDialog(view, "Silahkan Pilih Item Untuk dimasukan");
            return;
        }
        if (view.getTableBarangKeluar().getSelectedRowCount() == 0) {
            JOptionPane.showMessageDialog(view, "Silahkan Pilih baris untuk diseleksi");
            return;
        }

        DbBarang barang = view.getBarang();
        DbBarangKeluar barangKeluarBegin = view.getBarangKeluar();
        Integer idPengeluaran = Integer.parseInt(view.getTxtIdPengeluaran().getText());
        Date tanggalKeluar = (Date) view.getTxtTanggalKeluar().getValue();
        String pemohon = view.getTxtPemohon().getText();
        String keperluan = view.getTxtKeperluan().getText();
        String jumlah = view.getTxtJumlah().getText();
        String keterangan = view.getTxtKeterangan().getText();

        if (JOptionPane.showConfirmDialog(view, "Anda yakin akan menghapus?") == JOptionPane.OK_OPTION) {
            barang.setStock(barang.getStock() + barangKeluarBegin.getJumlah());
            model.setIdKeluar(idPengeluaran);
            model.setBarang(barang);
            model.setPemohon(pemohon);
            model.setJumlah(barangKeluarBegin.getJumlah());
            model.setTanggalKeluar(tanggalKeluar);
            model.setKeperluan(keperluan);
            model.setKeterangan(keterangan);
            try {
                model.deleteBarangKeluar();
            } catch (ErrorMessage ex) {
                JOptionPane.showMessageDialog(view, new Object[]{
                    "Terjadi error pada database dengan pesan :",
                    ex.getMessage()
                });
            } finally {
                model.resetForm();
            }
        }

    }

    public void searchPengeluaran(DbBarangKeluarView view) {
        String searchText = view.getTxtSearchText().getText();
        Date fisrtDate = new Date();
        Date lastDate = new Date();
        try {
            fisrtDate = (Date) view.getTxtFirstDate().getValue();
            lastDate = (Date) view.getTxtLastDate().getValue();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(view, "Format tanggal salah, silahkan reset");
        }

        model.setSearchText(searchText);
        if (view.getRadioByDate().isSelected()) {
            model.setFirstDate(fisrtDate);
            try {
                model.searchBarangKeluarByDate();
            } catch (ErrorMessage ex) {
                JOptionPane.showMessageDialog(view, new Object[]{
                    "Terjadi error pada database dengan pesan :",
                    ex.getMessage()
                });
            } finally {
                model.resetForm();
            }

        } else if (view.getRadioByMonth().isSelected() == true) {
            model.setListDate(DateFactory.getMonthOfDay(fisrtDate));
            try {
                model.searchBarangKeluarByMonth();

            } catch (ErrorMessage ex) {
                JOptionPane.showMessageDialog(view, new Object[]{
                    "Terjadi error pada database dengan pesan :",
                    ex.getMessage()
                });
            } finally {
                model.resetForm();
            }
        } else if (view.getRadioByRange().isSelected()) {
            if (fisrtDate.after(lastDate)) {
                JOptionPane.showMessageDialog(view, "Tanggal Awal tidak boleh lebih dari tanggal akhir");
                model.resetForm();

            } else {
                List<Date> listDate = new ArrayList<>();
                listDate.add(fisrtDate);
                listDate.add(lastDate);
                model.setListDate(listDate);
                System.out.println("range");
                try {
                    model.searchBarangKeluarByDateRange();
                } catch (ErrorMessage ex) {
                    JOptionPane.showMessageDialog(view, new Object[]{
                        "Terjadi error pada database dengan pesan :",
                        ex.getMessage()
                    });
                } finally {
                    model.resetForm();
                }
            }

        } else {
            try {
                model.searchBarangKeluarByKeyWords();
                System.out.println("Key");
            } catch (ErrorMessage ex) {
                JOptionPane.showMessageDialog(view, new Object[]{
                    "Terjadi error pada database dengan pesan :",
                    ex.getMessage()
                });
            } finally {
                model.resetForm();
            }
        }
    }
    
    public void print(DbBarangKeluarView view) {
        try {
            String reportName = "./report/com/wisnu/scs/report/DbBarangKeluarReport.jrxml";
            JasperDesign jasperDesign = JRXmlLoader.load(reportName);
            JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
            Map map = new HashMap();
            //map.put("Periode", view.getPeriod());
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map,
                    new JRBeanCollectionDataSource(
                            getDataTable(view)));
            JasperViewer.viewReport(jasperPrint, false);
        } catch (JRException ex) {
            Logger.getLogger(DbBarangController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    protected List<Object> getDataTable(DbBarangKeluarView view) {
        List<Object> object = new LinkedList<>();
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MMMM-YYYY");
        for (int i = 0; i < view.getTableBarangKeluar().getRowCount(); i++) {
            com.wisnu.scs.report.model.DbBarangKeluar barangKeluar = new com.wisnu.scs.report.model.DbBarangKeluar();
            barangKeluar.setNamaBarang((String) view.getTableBarangKeluar().getValueAt(i, 1));
            String date = sdf.format((Date) view.getTableBarangKeluar().getValueAt(i, 2));
            barangKeluar.setTanggalKeluar(date);

            barangKeluar.setPemohon((String) view.getTableBarangKeluar().getValueAt(i, 3));
            barangKeluar.setKeperluan((String) view.getTableBarangKeluar().getValueAt(i, 4));
            barangKeluar.setJumlah((Integer) view.getTableBarangKeluar().getValueAt(i, 5));
            barangKeluar.setKeterangan(String.valueOf(view.getTableBarangKeluar().getValueAt(i, 6)));
            object.add(barangKeluar);
        }
        return object;

    }
    
}
